import java.util.concurrent.atomic.AtomicInteger;

/**
 *   CAS是什么？全称为Compare-And-Swap 比较并交换 ,它是一条CPU并发原语。
 *   它的功能是判断内存某个为止的值是否为预期值，如果是则更改为新的值，这个过程是原子的。
 *   CAS是一条CPU的原子指令，不会造成所谓的数据不一致问题
 *   缺点：1.循环时间长，开销大
 *        2.只能保证一个共享变量的原子操作
 *        3.引出来ABA问题
 *    解决：原子引用+时间戳
 */

public class CASDemo {
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(5);
        System.out.println(atomicInteger.compareAndSet(5, 2021)+"\t current data:"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(5,1024)+"\t current data:"+atomicInteger.get());
        System.out.println(atomicInteger.getAndIncrement());//2021,此处不是返回var5+var4，也不是返回var1
        // 此时atomicInteger变成了2022，但是getAndIncrement()的返回值为参数var5,所以还是2021
        System.out.println(atomicInteger.get());//2022
        System.out.println(atomicInteger.getAndIncrement());//2022,此时atomicInteger变成了2023
        /**
         * 1.Unsafe类是CAS的核心类，由于Java方法无法直接访问底层系统，需要通过本地(native)方法来访问，Unsafe相当于
         * 一个后门，基于该类可以直接操作特定的内存数据。Unsafe类存在于 sun.misc包中，其内部方法操作可以像C的指针
         * 一样直接操作内存，因为Java中CAS操作的执行依赖于Unsafe类的方法。
         *Unsafe类中的所有方法都是native修饰的，也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应任务
         * 2.变量valueOfSet，表示该变量值在内存中的偏移地地址，因为Unsafe就是根据内存偏移地址获取数据的
         * 3.变量value用volatile修饰，保证了多线程之间的内存可见性
         */
    }
}
